/**
	********************************************************************************
	*
	*文件名称：
	*
	*文件日期：
	*
	*文件描述：
	*
	*文件版本：
	*
	*修改历史：
	*
	********************************************************************************
***/

/*******************************	头文件包含区	**********************************/
#include "com_pc.h"
#include "at_cmd_tx.h"
#include "at_cmd_rx.h"

/******************************* 全局变量定义区 **********************************/
pcUartStruct pcUart __attribute__((at(0x10000E00)));

/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/
void PC_RxCallback(void)
{
}

/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/
void my_pc_Task(void)
{
	if (pcUart.rx_pc_flag)
	{
		pcUart.rx_pc_flag = 0;
		//处理这个接收字符串
		my_pc_recv();
		my_pc_readinit();
	}
}
/**
	*********************************************************************************
	*
	*函数名称：void COM_ReadInit(void)
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：串口读数据初始化
	*
	*********************************************************************************
**/
void my_pc_readinit(void)
{
}

/**
	*********************************************************************************
	*
	*函数名称：void COM_ReadInit(void)
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：串口读数据初始化
	*
	*********************************************************************************
**/
void my_pc_send_data(uint8_t *pbuf, uint16_t len)
{
	uart0_send(pbuf, len);
	DELAY
}
/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/
//void data_deal_pc(uint8_t *deal_buf,uint16_t deal_data_len)
//{
//  uint8_t i,j;
//  global_control.protocol.fun_code = deal_buf[5];
//	memset(main_tx.my_at_sendbuf,0,sizeof(main_tx.my_at_sendbuf));
//  switch(global_control.protocol.fun_code)
//  {
//    case 0x03:
//        global_control.protocol.reg_addr[0] = (deal_buf[6]<<8) + deal_buf[7];
//        global_control.protocol.reg_len[0] = deal_buf[8];
//        fun_code_read();
//        my_pc_send_data(main_tx.my_at_sendbuf,strlen((char*)main_tx.my_at_sendbuf));
//    break;
//    case 0x06:
//				deal_buf += 6;
//        global_control.protocol.reg_addr[0] = pCharToU16(deal_buf);deal_buf+=2;
//        global_control.protocol.reg_len[0] = 1;
//        global_control.protocol.data_buf[0]=deal_buf;
//        global_control.protocol.data[0] = pCharToU16(deal_buf);deal_buf+=2;
//
//				/*将数据写入到内存中，同时对地址判断是场景策略包还是升级包还是其他正常包*/
//        protocol_write(global_control.protocol.reg_addr[0],global_control.protocol.data_buf[0],global_control.protocol.reg_len[0]);
//        fun_code_singleWrite();
//        my_pc_send_data(main_tx.my_at_sendbuf,strlen((char*)main_tx.my_at_sendbuf));
//        data_flash_write();//保存一次参数
//    break;
//    case 0x10:
//        global_control.protocol.reg_num = deal_buf[6];
//        if(global_control.protocol.reg_num > 3)  return;
//        j = 0;
//        for(i=0;i<global_control.protocol.reg_num;i++)
//        {
//          global_control.protocol.reg_addr[i] = ((uint16_t)deal_buf[7+j] << 8) + deal_buf[8+j];
//          global_control.protocol.reg_len[i] = deal_buf[9+j];
//          global_control.protocol.data_buf[i]= &deal_buf[10+j];
//          j =3 + global_control.protocol.reg_len[i] * 2;
//        }
//        fun_code_write();
//        my_pc_send_data(main_tx.my_at_sendbuf,strlen((char*)main_tx.my_at_sendbuf));
//        data_flash_write();//保存一次参数
//    break;
//  }
//  memset(&global_control.protocol,0,sizeof(global_control.protocol));
//}
/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/
void my_pc_recv(void)
{
#ifdef PUBLIC_PROTOCOL
	if ((pcUart.pc_rx_buf[0] == 0x63 ||  pcUart.pc_rx_buf[0] == 0x73 )&& pcUart.pc_rx_buf[1] == 0x00 && pcUart.pc_rx_buf[2] == 0x00 && pcUart.pc_rx_buf[3] == 0x00) //数据接收
#else
	if (pcUart.pc_rx_buf[0] == 0x63 && pcUart.pc_rx_buf[1] == 0x00 && pcUart.pc_rx_buf[2] == 0x00 && pcUart.pc_rx_buf[3] == 0x00) //数据接收
#endif
	{
		if (!crc_check(pcUart.pc_rx_buf, pcUart.my_pc_readLen))
			return; //crc校验
		LOGD("crc ok!\r\n");
#ifdef PUBLIC_PROTOCOL
				if (pcUart.pc_rx_buf[0] == 0x63) 
			{
				reg.R.m_73or63 = 1;
			}
			else if(pcUart.pc_rx_buf[0] == 0x73)
			{
				reg.R.m_73or63 = 0;
			}
			else
			{
				return;
			}
#endif
		data_deal(pcUart.pc_rx_buf, pcUart.my_pc_readLen, PC_Uart);
	}
	if (strstr((char *)pcUart.pc_rx_buf, (char *)"AT+") != NULL)
	{
		//转发AT指令
		memset(main_tx.my_at_sendbuf, 0, sizeof(main_tx.my_at_sendbuf));
		memmove(main_tx.my_at_sendbuf, pcUart.pc_rx_buf, pcUart.my_pc_readLen);
		my_usart_send_data(main_tx.my_at_sendbuf, strlen((char *)main_tx.my_at_sendbuf));
	}
	if (strstr((char *)pcUart.pc_rx_buf, (char *)"log on") != NULL)
	{
		logEN = 1;
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"log off") != NULL)
	{
		logEN = 0;
	}
	if (strstr((char *)pcUart.pc_rx_buf, (char *)"testON") != NULL)
	{
		testEN = 1;
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"testOFF") != NULL)
	{
		testEN = 0;
	}
	if (strstr((char *)pcUart.pc_rx_buf, (char *)"get imei") != NULL)
	{
		LOGD_PC("imei:%s\r\n", device_info.imei);
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"get iccid") != NULL)
	{
		memset(pcUart.pc_tx_buf, 0, sizeof(pcUart.pc_tx_buf));  
		LOGD_PC("iccid:%s\r\n", device_info.iccid);
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"get software") != NULL)
	{
		LOGD_PC("software:%d\r\n", reg.R.software_version);
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"get hardware") != NULL)
	{
		swapUint16_t_Plus((u16 *)reg.R.hardware_version, sizeof(reg.R.hardware_version) / 2);
		LOGD_PC("hardware:%s\r\n", reg.R.hardware_version);
		swapUint16_t_Plus((u16 *)reg.R.hardware_version, sizeof(reg.R.hardware_version) / 2);
	}
	else if (strstr((char *)pcUart.pc_rx_buf, (char *)"get name rule") != NULL)
	{
	#if (PROJECT_TYPEDEF == NB)
		LOGD_PC("name rule:EXC-TL1-N11PE-STQ-II\r\n");
	#elif (PROJECT_TYPEDEF == NB_ONENET)
		LOGD_PC("name rule:EXC-TL1-N11PE-SMO-II\r\n");
	#elif (PROJECT_TYPEDEF == CAT1)
		LOGD_PC("name rule:EXC-TL1-C11PE-STQ-II\r\n");
	#endif
		//LOGD("iccid:%d", reg.R.software_version);
	}
}

/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/
void pc_uart_return(void (*tx_fun)(void))
{
	global_control.protocol = protocol;
	memset(&main_tx, 0, sizeof(main_tx));
	tx_fun();
	my_pc_send_data(main_tx.my_at_sendbuf, strlen((char *)main_tx.my_at_sendbuf));
}
